package study.java.jdk.jdk8._1_stream.collectors.collecting_and_then;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import study.java.jdk.jdk8.User;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@Slf4j
public class _1_collectingAndThen_Test {


    /**
     * ==============================
     * （1）先执行了一个归纳操作，然后再对归纳的结果进行 Function 函数处理输出一个新的结果
     * （2）先进行结果集的收集，然后将收集到的结果集进行下一步的处理
     * （3）调整收集器以执行额外的完成转换
     * ==============================
     *
     * @param downstream Collector（下一个收集器）
     * @param finisher   Function（应用于下游收集器最终结果的函数）
     */
    @Test
    public void test() {
        List<String> dataLt = Arrays.asList("123", "456", "789", "123");
        //
        Integer dest = dataLt.stream()
                .collect(Collectors.collectingAndThen(
                        Collectors.toList(),
                        e -> {
                            // 此处是
                            log.info(e.getClass().getSimpleName());
                            return e.size();
                        })
                );
        log.info("{}", dest);
    }

    @Test
    public void test2() {
        List<String> dataLt = Arrays.asList("123", "456", "789", "123");
//
//        dataLt = dataLt.stream().collect(Collectors.collectingAndThen(
//                Collectors.filtering(e -> !e.equals("123"), Collectors.toList()),
//                e -> e));
//        log.info("{}", dataLt);
    }

    /**
     * （1）先分组，
     * （2）对分组后 Map 进行 Function
     */
    @Test
    public void test1() {
        //
        List<User> userLt = Arrays.asList(
                new User("1001", "wangzhj"),
                new User("1001", "wzj"),
                new User("1003", "zero")
        );

        Map<String, Integer> tt = userLt.stream()
                .collect(Collectors.collectingAndThen(
                        Collectors.groupingBy(User::getCode),
                        map -> {
                            Set<Map.Entry<String, List<User>>> set = map.entrySet();
                            Map<String, Integer> s = set.stream()
                                    .collect(Collectors.toMap(e -> e.getKey(), e -> {
                                        log.info("{}", e);
                                        return e.getValue().size();
                                    }));
                            return s;
                        }));
        log.info("{}", tt);
    }
}
